home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Communications / PPPMonitor1.16 / Source / PPPMonitor.m < prev    next >
Text File  |  1996-02-24  |  8KB  |  297 lines

  1. // -------------------------------------------------------------------------------------
  2. // PPPMonitor.m
  3. // (Indent:4, Tabs:4)
  4. // -------------------------------------------------------------------------------------
  5. // Copyright 1996 Persistent Technologies, Inc. - all rights reserved
  6. // -------------------------------------------------------------------------------------
  7. // This source code comes with no warranty of any kind, and the user assumes all 
  8. // responsibility for its use.
  9. // -------------------------------------------------------------------------------------
  10. #import <libc.h>
  11. #import <stdlib.h>
  12. #import <string.h>
  13. #import <ctype.h>
  14. #import <appkit/appkit.h>
  15. #import "PPPMonitor.h"
  16. #import "ExecMonitor.h"
  17.  
  18. // -------------------------------------------------------------------------------------
  19. // user default vector
  20.  
  21. static NXDefaultsVector _userDefaults = {
  22.     {"CmdConnect"     , 0 },    // 0
  23.     {"SndConnect"     , 0 },    // 1
  24.     {"AppIconTimer"   , 0 },    // 2
  25.     {"CmdDisconnect"  , 0 },    // 3
  26.     {"SndDisconnect"  , 0 },    // 4
  27.     {"CmdTailLog"     , 0 },    // 5
  28.     {"CmdPing"        , 0 },    // 6
  29.     {"CmdPingInterval", 0 },    // 7
  30.     {"MiniShelf"      , 0 },    // 8
  31.     {"CmdLoadPPPLKS"  , 0 },    // 9
  32.     {"MiniShelfTile"  , 0 },    // 10
  33.     {"MiniShelfDots"  , 0 },    // 11
  34.     {NULL,0}
  35. };
  36.  
  37. // -------------------------------------------------------------------------------------
  38. @implementation PPPMonitor
  39.  
  40. // -------------------------------------------------------------------------------------
  41. // misc
  42. // -------------------------------------------------------------------------------------
  43.  
  44. /* return app (owner) name */
  45. - (const char*)appName
  46. {
  47.     return "PPPMonitor";
  48. }
  49.  
  50. /* run alert panel */
  51. - (int)errorPanel:(const char*)msg
  52. {
  53.     return NXRunAlertPanel("Error", msg, "OK", (char*)nil, (char*)nil);
  54. }
  55.  
  56. // -------------------------------------------------------------------------------------
  57. // menu actions
  58. // -------------------------------------------------------------------------------------
  59.  
  60. /* clear monitor text window */
  61. - (void)clearLog:(id)sender
  62. {
  63.     [[ExecMonitor sharedPPPMonitor] clearLog:sender];
  64. }
  65.  
  66. /* application termination */
  67. - terminate:sender
  68. {
  69.     if ([ExecMonitor canShutDown]) {
  70.         if (![ExecMonitor shutDown]) {
  71.             [self perform:_cmd with:sender afterDelay:500 cancelPrevious:YES];
  72.             return (id)nil;
  73.         }
  74.         return [super terminate:sender];
  75.     }
  76.     NXBeep();
  77.     [NSApp errorPanel:"Cannot quit while connection is still active"];
  78.     return (id)nil;
  79. }
  80.  
  81. // -------------------------------------------------------------------------------------
  82. // user defaults
  83. // -------------------------------------------------------------------------------------
  84.  
  85. /* read user default */
  86. - (const char*)readDefault:(const char*)name
  87. {
  88.     return NXReadDefault([self appName],name);
  89. }
  90.  
  91. /* return user default for specifed index */
  92. - (const char*)userDefaultValue:(int)ndx
  93. {
  94.     const char *val = _userDefaults[ndx].value;
  95.     return (val && *val)? val : (char*)nil;
  96. }
  97.  
  98. /* load defaults */
  99. - (void)_loadDefaults
  100. {
  101.     int i;
  102.     for (i = 0; _userDefaults[i].name; i++) {
  103.         const char *val = [self readDefault:_userDefaults[i].name];
  104.         _userDefaults[i].value = (char*)val;
  105.     }
  106. }
  107.  
  108. /* return deblanked string */
  109. char *deblank(const char *val)
  110. {
  111.     int n;
  112.     char *mval;
  113.     if (!val) val = "";
  114.     else { while (*val && isspace(*val)) val++; }
  115.     mval = STRDUP(val);
  116.     for (n = strlen(mval) - 1; (n >= 0) && isspace(mval[n]); n--) mval[n] = 0;
  117.     return mval;
  118. }
  119.  
  120. /* show preference panel */
  121. - (void)showPreferences:(id)sender
  122. {
  123.     int dft, dftCnt = [dftObjList count];
  124.     
  125.     /* fill preference fields */
  126.     for (dft = 0; dft < dftCnt; dft++) {
  127.         id valObj = [dftObjList objectAt:dft];
  128.         const char *val = _userDefaults[dft].value;
  129.  
  130. printf("Reading %d: \"%s\"\n", dft, [valObj name]);
  131.         
  132.         /* pre-filter */
  133.         if (dft == xFLG_SHOWSECONDS) {
  134.             if (!val) { val = "0"; }
  135.             else { while (*val && isspace(*val)) val++; }
  136.             [valObj setState:((*val=='2')?1:0)];
  137.         } else
  138.         if (dft == xCMD_TAILLOG) {
  139.             char tmpBuff[1024], *mval;
  140.             if (!val) { // look for a ppp log file
  141.                 char *c = "cat /etc/syslog.conf|grep /usr/adm/ppp|awk '{print $2;}'";
  142.                 FILE *pnum = popen(c,"r");
  143.                 if (pnum) {
  144.                     fgets(tmpBuff,sizeof(tmpBuff)-1,pnum);
  145.                     pclose(pnum);
  146.                     if (*tmpBuff) val = tmpBuff;
  147.                 }
  148.                 if (!val) val = "";
  149.             } 
  150.             mval = deblank(val);
  151.             [valObj setStringValue:mval];
  152.             free(mval);
  153.         } else
  154.         if (dft == xCMD_MINISHELF) {
  155.             char *v, *mval;
  156.             if (!val) { val = "/NextApps/Mail.app"; }
  157.             mval = deblank(val);
  158.             for (v = mval; *v; v++) { if (*v == ';') *v = '\n'; }
  159.             [valObj setSel:0:[valObj textLength]];
  160.             [valObj replaceSel:mval];
  161.             free(mval);
  162.         } else {
  163.             char *mval = deblank(val);
  164.             [valObj setStringValue:mval];
  165.             free(mval);
  166.         }
  167.         
  168.     }
  169.     [prefPanel makeKeyAndOrderFront:sender];
  170. }
  171.  
  172. /* cancel preferences */
  173. - (void)prefBtnOK:(id)sender
  174. {
  175.     int dft;
  176.  
  177.     /* cancel */
  178.     if ([sender tag] < 0) {
  179.         [prefPanel orderOut:sender];
  180.         return;
  181.     }
  182.     
  183.     /* update */
  184.     for (dft = 0; _userDefaults[dft].name; dft++) {
  185.     
  186.         /* update user defaults */
  187.         if (dft < [dftObjList count]) {
  188.             int len;
  189.             id valObj = [dftObjList objectAt:dft];
  190.             char buff[3000], *val = buff;
  191.             
  192. printf("Updating %d: \"%s\"\n", dft, [valObj name]);
  193.             
  194.             /* post filter */
  195.             if (dft == xFLG_SHOWSECONDS) {
  196.                 val = [valObj state]? "2" : "0";
  197.             } else
  198.             if (dft == xCMD_PINGINTERVAL) {
  199.                 int interval = atoi([valObj stringValue]);
  200.                 if (interval < 60) interval = 60;
  201.                 [valObj setIntValue:interval];
  202.                 val = (char*)[valObj stringValue];
  203.             } else
  204.             if (dft == xCMD_MINISHELF) {
  205.                 len = [valObj getSubstring:buff start:0 length:sizeof(buff) - 1];
  206.                 if (len >= sizeof(buff)) buff[sizeof(buff) - 1] = 0;
  207.                 for (val = buff; *val; val++) { if (*val == '\n') *val = ';'; }
  208.                 while ((val > buff) && (*(val-1) == ' ')) *(--val) = 0;
  209.                 strcpy(val," ");
  210.                 val = buff;
  211.             } else {
  212.                 val = (char*)[valObj stringValue];
  213.             }
  214.             while (*val && isspace(*val)) val++; // skip leading space
  215.             
  216.             /* write new value */
  217.             NXWriteDefault([self appName], _userDefaults[dft].name, val);
  218.         }
  219.         
  220.         /* read new value */
  221.         _userDefaults[dft].value = 
  222.             (char*)NXReadDefault([self appName],_userDefaults[dft].name);
  223.     }
  224.     [prefPanel orderOut:sender];
  225.     [ExecMonitor updateFromDefaults];
  226.     
  227. }
  228.  
  229. // -------------------------------------------------------------------------------------
  230. // OpenStep api support
  231. // -------------------------------------------------------------------------------------
  232.  
  233. /* set application icon (OpenStep api) */
  234. - (void)setApplicationIconImage:(NXImage*)image
  235. {
  236.     id              iconWin = [NXApp appIcon];      
  237.     NXPoint         iconOrigin = { 0.0, 0.0 };
  238.     NXSize          imageSize;
  239.     static id       tileImage = (id)nil;
  240.     static NXSize   tileSize = { 0.0, 0.0 };
  241.  
  242.     /* init dock icon tile */
  243.     if (!tileImage && (tileImage = [NXImage findImageNamed:"NXAppTile"])) {
  244.         [tileImage getSize:&tileSize];
  245.     }
  246.  
  247.     /* redraw AppIcon */
  248.     [[iconWin contentView] lockFocus];
  249.     PSsetinstance(FALSE);
  250.     [tileImage composite:NX_COPY toPoint:&iconOrigin];
  251.     [tileImage getSize:&tileSize];
  252.     [image getSize:&imageSize];
  253.     iconOrigin.x = (tileSize.width  - imageSize.width ) / 2.0;
  254.     iconOrigin.y = (tileSize.height - imageSize.height) / 2.0;
  255.     [image composite:NX_SOVER toPoint:&iconOrigin];
  256.     [[iconWin contentView] unlockFocus];
  257.     [iconWin display];
  258.   
  259. }
  260.  
  261. // -------------------------------------------------------------------------------------
  262. // application initialization
  263. // -------------------------------------------------------------------------------------
  264.  
  265. /* application initialization */
  266. - appDidInit:sender
  267. {
  268.     /* create user-default preferences object list */
  269.     dftObjList = [[List alloc] init];
  270.     [dftObjList addObject:dftCmdConnect];        // 0
  271.     [dftObjList addObject:dftSndConnect];        // 1
  272.     [dftObjList addObject:dftAppTileTimer];        // 2
  273.     [dftObjList addObject:dftCmdDisconnect];    // 3
  274.     [dftObjList addObject:dftSndDisconnect];    // 4
  275.     [dftObjList addObject:dftCmdTailLog];        // 5
  276.     [dftObjList addObject:dftCmdPing];            // 6
  277.     [dftObjList addObject:dftCmdPingInterval];    // 7
  278.     [dftObjList addObject:dftMiniShelf];        // 8
  279.     [dftObjList addObject:dftCmdLoadPPPLKS];    // 9
  280.  
  281.     /* load command defaults */
  282.     [self _loadDefaults];
  283.  
  284.     /* create monitor */
  285.     if (![ExecMonitor sharedPPPMonitor]) [self terminate:self];
  286.     
  287.     /* show preferences */
  288.     if (!CMD_CONNECT || !CMD_DISCONNECT) {
  289.         [NSApp errorPanel:"Define Connect/Disconnect commands before connecting\n"];
  290.         [self showPreferences:nil];
  291.     }
  292.     
  293.     return self;
  294. }
  295.  
  296. @end
  297.